#include<iostream>
#include<string>
#include<vector>
using namespace std;
typedef long long LL;
const int N = 3e5 + 10;
vector<int>g[N];
int f[N];
int sz[N];
int n;
int ans;
int son[N];
int son_1[N];
//void dfs(int u, int fa)
//{
//	sz[u] = 1;
//	bool flag = 0;
//	for (int x : g[u]) {
//		if (x == fa)continue;
//		dfs(x, u);
//		if (!flag) {
//			son[u] = x;
//			flag = 1;
//		}
//		else {
//			if (sz[x] < sz[son[u]]) {
//				son[u] = x;
//			}
//		}
//		sz[u] += sz[x];
//		son_1[u]++;
//	}
//}
//
//void dfs2(int u, int fa)
//{
//	if (son_1[u] == 2) {
//		for (int x : g[u]) {
//			if (x == fa)continue;
//			if (x != son[u]) {
//				ans += (sz[x] - 1);
//			}
//			else dfs(x, u);
//		}
//	}
//	else if (son_1[u] == 1) {
//		ans += (sz[son[u]] - 1);
//	}
//	else return;
//}

void dfs(int u, int fa)
{
	sz[u] = 1;
	int a = -1;
	int b = -1;
	for (int x : g[u]) {
		if (x == fa)continue;
		dfs(x, u);
		sz[u] += sz[x];
		if (a == -1)a = x;
		else if (b == -1)b = x;
		// 		if (g[u].size() == 2) {
		// 			f[u] = sz[u] - 1;
		// 		}
		// 		else if (g[u].size() == 3) {
		// 			f[u] = max(f[u], f[x] + sz[u] - 1);
		// 		}
	}
	if (a == -1)f[u] = 0;
	else if (b == -1)f[u] = sz[u] - 2;
	else f[u] = max(f[a] + sz[b] - 1, f[b] + sz[a] - 1);
}
int main()
{
	int t;
	cin >> t;
	while (t--) {
		cin >> n;
		ans = 0;
		for (int i = 1; i <= n; i++) {
			sz[i] = 0;
			g[i].clear();
			f[i] = 0;
		}
		for (int i = 0; i < n; i++) {
			int a, b;
			scanf("%d%d", &a, &b);
			g[a].push_back(b);
			g[b].push_back(a);
		}
		dfs(1, 0);
		cout << f[1] << endl;
	}
	return 0;
}